home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ISO_SRC.ZIP / EXAMPLE.C next >
C/C++ Source or Header  |  1996-06-08  |  12KB  |  429 lines

  1. /*
  2.   All work in this is property of Jim Adams.
  3.   I assume no responsibility of damages resulting in its use.
  4.   You may freely distribute this as you feel.
  5.   Make sure to give credit to me if you do.
  6.  
  7.                     Jim Adams  1996
  8. */
  9.  
  10. /*  Set what compiler you're using */
  11. #define COMPILER_BORLAND
  12. /*
  13. #define COMPILER_WATCOM
  14. */
  15.  
  16. #include <dos.h>
  17. #include <stdio.h>
  18. #include <string.h>
  19. #include <malloc.h>
  20. #include <stdlib.h>
  21.  
  22. /*
  23.   Remove the following includes if you are going to use a makefile
  24.     or compile as a project.  I use this method as only the main
  25.     file needs these functions.  It's almost like appending all the
  26.     libraries into the main file.
  27. */
  28. #include "video.c"
  29. #include "block.c"
  30. #include "pcx.c"
  31. #include "keytrap.c"
  32.  
  33. char *gfx_tiles[40];
  34.  
  35. typedef struct {
  36.   char num;
  37.   char tile[10];
  38.   char height[10];
  39.   char layer[10];
  40. } MAP_INFO;
  41. MAP_INFO map[32][32];
  42.  
  43. char virtual_screen[64000];
  44. char palette[768];
  45.  
  46. signed short int sprite_x,sprite_y,sprite_layer,sprite_frame;
  47.  
  48. main()
  49. {
  50.   signed short int viewx,viewy,scroll_speed;
  51.  
  52.   setvmode(0x03);
  53.   printf("Isometric Engine Example (c) 1996 by Jim Adams\n");
  54.   printf("Use the keypad to move, 0-9 to control speed.  ESC quits.\n\n");
  55.   printf("PRESS ANY KEY TO BEGIN.\n");
  56.   if(!getch())
  57.     getch();
  58.  
  59.   srand(1);
  60.  
  61.   if(!load_tiles())
  62.     return;
  63.  
  64.   setup_map();
  65.  
  66.   setvmode(0x13);
  67.   palette_set(palette,256,0);
  68.  
  69.   viewx = 0;
  70.   viewy = 0;
  71.   scroll_speed = 2;
  72.  
  73.   sprite_x = 0;
  74.   sprite_y = 0;
  75.   sprite_layer = 1;
  76.   sprite_frame = 12;
  77.  
  78.   key_trap();
  79.  
  80.   // loop until ESC pressed
  81.   while(!key_press[1]) {
  82.  
  83.     // check for HOME
  84.     if(key_press[71])
  85.       viewx -= scroll_speed;
  86.  
  87.     // check for END
  88.     if(key_press[79])
  89.       viewy += scroll_speed;
  90.  
  91.     // check for PGUP
  92.     if(key_press[73])
  93.       viewy -= scroll_speed;
  94.  
  95.     // check for PGDN
  96.     if(key_press[81])
  97.       viewx += scroll_speed;
  98.  
  99.     // check for LEFT
  100.     if(key_press[75]) {
  101.       viewx -= scroll_speed;
  102.       viewy += scroll_speed;
  103.     }
  104.  
  105.     // check for RIGHT
  106.     if(key_press[77]) {
  107.       viewx += scroll_speed;
  108.       viewy -= scroll_speed;
  109.     }
  110.  
  111.     // check for UP
  112.     if(key_press[72]) {
  113.       viewx -= scroll_speed;
  114.       viewy -= scroll_speed;
  115.     }
  116.  
  117.     // check for DOWN
  118.     if(key_press[80]) {
  119.       viewx += scroll_speed;
  120.       viewy += scroll_speed;
  121.     }
  122.  
  123.     // check for change in scroll speed
  124.     // 0
  125.     if(key_press[11])
  126.       scroll_speed=2;
  127.     // 1
  128.     if(key_press[2])
  129.       scroll_speed=4;
  130.     // 2
  131.     if(key_press[3])
  132.       scroll_speed=6;
  133.     // 3
  134.     if(key_press[4])
  135.       scroll_speed=8;
  136.     // 4
  137.     if(key_press[5])
  138.       scroll_speed=10;
  139.     // 5
  140.     if(key_press[6])
  141.       scroll_speed=12;
  142.     // 6
  143.     if(key_press[7])
  144.       scroll_speed=14;
  145.     // 7
  146.     if(key_press[8])
  147.       scroll_speed=16;
  148.     // 8
  149.     if(key_press[9])
  150.       scroll_speed=18;
  151.     // 9
  152.     if(key_press[10])
  153.       scroll_speed=20;
  154.  
  155.     // wrap around view
  156.     if(viewx < 0)
  157.       viewx += 32*16;    // 16 fine cords per map, map is 32 long
  158.     if(viewx >= 32*16)
  159.       viewx-=32*16;
  160.     if(viewy < 0)
  161.       viewy += 32*16;
  162.     if(viewy >= 32*16)
  163.       viewy-=32*16;
  164.  
  165.     // move and update the sprite
  166.     sprite_x += ((rand()%4 - 2) *2);
  167.     sprite_y += ((rand()%4 - 2) *2);
  168.     if(sprite_x<0)
  169.       sprite_x+=32*16;
  170.     if(sprite_x >= 32*16)
  171.       sprite_x-=32*16;
  172.     if(sprite_y < 0)
  173.       sprite_y += 32*16;
  174.     if(sprite_y >= 32*16)
  175.       sprite_y-=32*16;
  176.     if(sprite_frame == 12)
  177.       sprite_frame = 13;
  178.     else sprite_frame = 12;
  179.  
  180.     clear_screen(virtual_screen,0);
  181.     draw_map(viewx,viewy,virtual_screen);
  182.     display_screen(virtual_screen);
  183.   }
  184.  
  185.   key_untrap();
  186.  
  187.   setvmode(0x03);
  188.   free_tiles();
  189. }
  190.  
  191. load_tiles()
  192. {
  193.   char file[81],num,i,j,k;
  194.  
  195.   if(!pcx_load("tiles.pcx",virtual_screen,palette))
  196.     return(0);
  197.  
  198.   num=0;
  199.   for(i=0;i<4;i++) {
  200.     for(j=0;j<10;j++) {
  201.       if((gfx_tiles[num++] = block_clip2(virtual_screen,j*32,i*50,32,50))==NULL)
  202.         return(0);
  203.     }
  204.   }
  205.  
  206.   return(1);
  207. }
  208.  
  209. free_tiles()
  210. {
  211.   char i;
  212.  
  213.   for(i=0;i<40;i++)
  214.     free(gfx_tiles[i]);
  215. }
  216.  
  217. draw_map(signed short int x,signed short int y,char *screen)
  218. {
  219.   signed short int i,j,k;
  220.   signed short int current_layer,highest_layer,next_layer,last_layer;
  221.   signed short int mapx,mapy,mx,my,tx,ty,xo,yo,xa,ya,screenx,screeny;
  222.   signed short int length;
  223.   char tile_to_draw,height_to_draw;
  224.  
  225.   signed short int sprite_mx,sprite_my,spritex,spritey,xx,yy;
  226.  
  227.   current_layer = 0;
  228.   highest_layer = 0;
  229.   last_layer    = 0;
  230.  
  231.   sprite_mx = sprite_x / 16;
  232.   sprite_my = sprite_y / 16;
  233.  
  234.   mapx = x / 16;
  235.   xo   = x & 15;
  236.   mapy = y / 16;
  237.   yo   = y & 15;
  238.   xa   = xo - yo;
  239.   ya   = (xo>>1) + (yo>>1);
  240.  
  241.   while(1) {
  242.     next_layer = 255;
  243.     mx = mapx;
  244.     my = mapy;
  245.     screeny = 8 - ya;
  246.  
  247.     // normal height is 28, go higher for big objects
  248.     for(i=0;i<38;i++) {
  249.       tx = mx;
  250.       ty = my;
  251.  
  252.       screenx = 16 - xa;
  253.  
  254.       length = 12;
  255.       if(i&1) {
  256.         length++;
  257.         screenx-=16;
  258.       }
  259.  
  260.       for(j=0;j<length;j++) {
  261.  
  262.         for(k=0;k<map[ty][tx].num;k++) {
  263.           if(map[ty][tx].layer[k] == current_layer) {
  264.             tile_to_draw = map[ty][tx].tile[k];
  265.             height_to_draw = map[ty][tx].height[k];
  266.             block_draw(gfx_tiles[tile_to_draw],screenx,screeny-height_to_draw,screen);
  267.           }
  268.  
  269.           if(tx == sprite_mx && ty == sprite_my && current_layer==sprite_layer) {
  270.             xo = sprite_x & 15;
  271.             yo = sprite_y & 15;
  272.             xx   = xo - yo;
  273.             yy   = (xo>>1) + (yo>>1);
  274.             block_draw(gfx_tiles[sprite_frame],screenx-32+xx,screeny-16+yy,screen);
  275.           }
  276.  
  277.           if(map[ty][tx].layer[k] > highest_layer)
  278.              highest_layer = map[ty][tx].layer[k];
  279.  
  280.           if(map[ty][tx].layer[k] < next_layer && map[ty][tx].layer[k] > last_layer)
  281.             next_layer = map[ty][tx].layer[k];
  282.         }
  283.  
  284.         screenx+=32;
  285.  
  286.         // map update and wrap around
  287.         if((tx+=1) > 31)
  288.           tx = 0;
  289.         if((ty-=1) < 0)
  290.           ty = 31;
  291.       }
  292.  
  293.       screeny+=8;
  294.  
  295.       if(i & 1) {
  296.         if((mx+=1) > 31)
  297.           mx = 0;
  298.       } else {
  299.         if((my+=1) > 31)
  300.           my = 0;
  301.       }
  302.     }
  303.  
  304.     last_layer = current_layer;
  305.     // smudge to fit in sprite layer
  306.     if(current_layer == 0)
  307.       current_layer = 1;
  308.     else current_layer = next_layer;
  309.  
  310.     if(current_layer > highest_layer)
  311.       break;
  312.   }
  313. }
  314.  
  315. setup_map()
  316. {
  317.   signed short int i,j;
  318.   char transform_map[32][32] = {
  319.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,
  320.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,
  321.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,
  322.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,
  323.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,
  324.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,
  325.     0,0,0,0,0,0,0,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,
  326.     0,0,0,0,0,0,0,6,6,6,5,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,
  327.     0,0,0,0,0,0,0,6,6,6,5,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,0,0,0,0,0,
  328.     0,0,0,0,0,0,0,4,4,7,3,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,
  329.     0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,
  330.     0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  331.     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
  332.     0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  333.     0,6,6,6,6,5,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  334.     0,6,6,6,6,5,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  335.     0,6,6,6,6,5,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  336.     0,6,6,6,6,6,5,0,1,0,0,0,0,0,0,0,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,
  337.     0,6,6,6,6,6,8,1,1,0,0,0,0,0,0,0,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,
  338.     0,4,4,4,4,4,3,0,0,0,0,0,0,0,0,0,4,4,4,3,0,0,0,0,0,0,0,0,0,0,0,0,
  339.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  340.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  341.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  342.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  343.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,
  344.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,
  345.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,
  346.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,
  347.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,
  348.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,
  349.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,
  350.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0 };
  351.  
  352.   // transform the map into map structure
  353.   for(i=0;i<32;i++) {
  354.     for(j=0;j<32;j++) {
  355.       switch(transform_map[i][j]) {
  356.         case 0:  map[i][j].num       = 1;
  357.                  map[i][j].tile[0]   = 0;
  358.                  map[i][j].height[0] = 0;
  359.                  map[i][j].layer[0]  = 0;
  360.                  break;
  361.         case 1:  map[i][j].num       = 1;
  362.                  map[i][j].tile[0]   = 1;
  363.                  map[i][j].height[0] = 0;
  364.                  map[i][j].layer[0]  = 0;
  365.                  break;
  366.         case 2:  map[i][j].num       = 1;
  367.                  map[i][j].tile[0]   = 2;
  368.                  map[i][j].height[0] = 0;
  369.                  map[i][j].layer[0]  = 0;
  370.                  break;
  371.         case 3:  map[i][j].num       = 3;
  372.                  map[i][j].tile[0]   = 3;
  373.                  map[i][j].height[0] = 0;
  374.                  map[i][j].layer[0]  = 1;
  375.                  map[i][j].tile[1]   = 4;
  376.                  map[i][j].height[1] = 0;
  377.                  map[i][j].layer[1]  = 1;
  378.                  map[i][j].tile[2]   = 5;
  379.                  map[i][j].height[2] = 43;
  380.                  map[i][j].layer[2]  = 2;
  381.                  break;
  382.         case 4:  map[i][j].num       = 2;
  383.                  map[i][j].tile[0]   = 3;
  384.                  map[i][j].height[0] = 0;
  385.                  map[i][j].layer[0]  = 1;
  386.                  map[i][j].tile[1]   = 5;
  387.                  map[i][j].height[1] = 43;
  388.                  map[i][j].layer[1]  = 2;
  389.                  break;
  390.         case 5:  map[i][j].num       = 2;
  391.                  map[i][j].tile[0]   = 4;
  392.                  map[i][j].height[0] = 0;
  393.                  map[i][j].layer[0]  = 1;
  394.                  map[i][j].tile[1]   = 5;
  395.                  map[i][j].height[1] = 43;
  396.                  map[i][j].layer[1]  = 2;
  397.                  break;
  398.         case 6:  map[i][j].num       = 1;
  399.                  map[i][j].tile[0]   = 5;
  400.                  map[i][j].height[0] = 43;
  401.                  map[i][j].layer[0]  = 2;
  402.                  break;
  403.         case 7:  map[i][j].num       = 3;
  404.                  map[i][j].tile[0]   = 3;
  405.                  map[i][j].height[0] = 0;
  406.                  map[i][j].layer[0]  = 1;
  407.                  map[i][j].tile[1]   = 10;
  408.                  map[i][j].height[1] = 0;
  409.                  map[i][j].layer[1]  = 1;
  410.                  map[i][j].tile[2]   = 5;
  411.                  map[i][j].height[2] = 43;
  412.                  map[i][j].layer[2]  = 2;
  413.                  break;
  414.         case 8:  map[i][j].num       = 3;
  415.                  map[i][j].tile[0]   = 4;
  416.                  map[i][j].height[0] = 0;
  417.                  map[i][j].layer[0]  = 1;
  418.                  map[i][j].tile[1]   = 11;
  419.                  map[i][j].height[1] = 0;
  420.                  map[i][j].layer[1]  = 1;
  421.                  map[i][j].tile[2]   = 5;
  422.                  map[i][j].height[2] = 43;
  423.                  map[i][j].layer[2]  = 2;
  424.                  break;
  425.       }
  426.     }
  427.   }
  428. }
  429.